package com.lavegue.dao.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import com.lavegue.common.BaseHibernateDao;
import com.lavegue.common.Page;
import com.lavegue.dao.UserInfoDao;
import com.lavegue.model.Msg;
import com.lavegue.model.UserInfo;

/**
 * author: luoweibin
 * date:2011-12-20
 * description:
 *
 */
public class UserInfoDaoImpl extends BaseHibernateDao<UserInfo, Integer> implements UserInfoDao {

	public UserInfoDaoImpl() {
		super(UserInfo.class);
	}
    
	public UserInfo findByAccount(String account) {
		List list = this.getHibernateTemplate().find("from UserInfo where account=? and flagdel is null", account);
		if (!list.isEmpty()) {
			return (UserInfo) list.get(0);
		}
		return null;
	}
	
	/**
	 * ljp 20111220 检测用户号码注册重复
	 * @return
	 */
	public List<UserInfo> searchUserByMobile(String mobile) {
		String hql = "from UserInfo u  where u.account=? and u.flagdel is null";
		List<UserInfo> users = this.getHibernateTemplate().find(hql, mobile);
		return users;
	}
	/**20120203
	 * 查询所有用户信息
	 */
	public List<UserInfo> findAllUserInfo() {
		List<UserInfo> list = this.getHibernateTemplate().find("from UserInfo where flagdel is null");
		if (!list.isEmpty()) {
			return list;
		}
		return null;
	}
	
	/**
	 * ljp 20111221 用户注册
	 */
	public boolean insertUserInfo(UserInfo uinfo) {
		try {
			this.getHibernateTemplate().save(uinfo);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return true;
	}

	/**
	 * ljp 20111222 修改用户密码
	 * 
	 * @param user对象
	 * @return
	 */
	public boolean updateUserPassword(UserInfo user) {
		try {
			this.getHibernateTemplate().update(user);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return true;
	}
	
	/**
	 * ljp 20111222 修改个人用户信息
	 * 
	 * @param user对象
	 * @return
	 */
	public boolean modifyUserInfo(UserInfo user) {
		try {
			this.getHibernateTemplate().update(user);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return true;
	}
	
	/**
	 * ljp 20120106 根据条件查询用户信息
	 * 
	 * @param pageNo 当前页数
	 * @param pageSize 每页多少条
	 * @param beginTime 选择开始时间
	 * @param endTime 选择结束时间
	 * @param userName 姓名 
	 * @param account 账号
	 * @param companyName 公司名称ID
	 * @param balBegin 开始余额
	 * @param balEnd 结束余额
	 * @param userType 用户属性
	 * @param userProvince 省份
	 * @param userCity 城市
	 * @param userZone 区县
	 * @return 用户对象
	 * @throws Exception
	 */
	public Page<UserInfo> findUserInfoList(int pageNo, int pageSize, Date beginTime, Date endTime,
								String userName,String account,Integer companyName,BigDecimal balBegin,BigDecimal balEnd,
								Integer userType,String userProvince,String userCity,String userZone){
		
		List<Criterion> condition = new ArrayList<Criterion>();
		//条件查询
		//姓名
		if(null != userName && !userName.trim().equals("")){  //姓名
			  condition.add(Restrictions.like("userName", userName, MatchMode.ANYWHERE));
		}
		
		// 时间  beginTime< addDate <endTime		
		if(null != beginTime && null != endTime){
			condition.add(Expression.between("addDate", beginTime, new java.sql.Date(endTime.getTime()+1000*60*60*24)));
		}else{
			if(null != beginTime){  //选择开始时间
				//查询某一天的记录[addDate >= beginTime and addDate < beginTime+一天的时间]
				condition.add(Expression.and(Expression.ge("addDate", new java.sql.Date(beginTime.getTime())),Expression.lt("addDate", new java.sql.Date(beginTime.getTime()+1000*60*60*24))));
			}
			if(null != endTime){   //选择结束时间
				  condition.add(Restrictions.and(Expression.ge("addDate", new java.sql.Date(endTime.getTime())),Expression.lt("addDate", new java.sql.Date(endTime.getTime()+1000*60*60*24))));
			}
		}
		//账号
		if(null != account && !account.equals("")){
			condition.add(Restrictions.eq("account", account));
		}
		//公司
		if(null != companyName && !companyName.equals("")){
			condition.add(Restrictions.eq("company.id", companyName));
		}
		
		if(null != balBegin && null != balEnd){
			condition.add(Expression.between("balance", balBegin, balEnd));
		}else{
			//开始余额
			if(null != balBegin && !balBegin.equals("")){
				condition.add(Restrictions.eq("balance", balBegin));
			}
			//结束余额
			if(null != balEnd && !balEnd.equals("")){
				condition.add(Restrictions.eq("balance", balEnd));
			}
		}
		
		
		//用户属性
		if(null != userType){  //用户类型(0-普通,1-VIP)
			condition.add(Restrictions.eq("type", userType));
		}
		
		//地区 省市区
		if(null != userProvince && !userProvince.equals("")){
			condition.add(Restrictions.eq("province", userProvince));
		}
		if(null != userCity && !userCity.equals("")){  
			condition.add(Restrictions.eq("city", userCity));
		}
		if(null != userZone && !userZone.equals("")){
			condition.add(Restrictions.eq("zone", userZone));
		}
		//20120203 标识着是否是被删除记录[1:删除]
		condition.add(Restrictions.isNull("flagdel"));
		
		//查询列表,根据 添加时间 排序
		Page<UserInfo> page = this.findPage(pageNo, pageSize, condition, Order.desc("addDate"));							
		
		return page;
	}
	
	/**
	 * ljp 20120109 查询所有用户信息
	 * 
	 * @param pageNo 当前页数
	 * @param pageSize 每页多少条
	 * @return 用户对象
	 * @throws Exception
	 */
	public Page<UserInfo> queryAllUserList(int pageNo, int pageSize){
		List<Criterion> condition = new ArrayList<Criterion>();
		//20120203 标识着是否是被删除记录[1:删除]
		condition.add(Restrictions.isNull("flagdel"));
		
		//查询列表,根据 最近你登录的时间 排序
		Page<UserInfo> page = this.findPage(pageNo, pageSize, condition, Order.desc("recentlyLoginDate"));							
		
		return page;
	}
	
		
}

